CloudWatch LogsのCLIツールをOSSとして公開しました
モバイルアプリサービス部の五十嵐です。
本エントリーでは、先日OSSとして公開したCloudWatch LogsのCLIツール lazy-awslogs について紹介します。
lazy-awslogsとは
lazy-awslogs とは、Python製のCLIツールである awslogs をより便利にしたGo製のCLIツールです。
Github: lazy-awslogs
Demo:
モチベーション
Goについて学び始めたばかりで何か作りたいと思っていたところに、同僚が CloudWatch Logs の CLI ツールを探していました。awslogs はとても良くできたツールですが、欲しいログを取得するまでに、LogGroup名やLogStream名を調べたり、コマンドごとにAWS Credentialsの情報を設定するのが面倒でした。(Credentialsについては環境変数やDefaultのprofileを用いて省略することもできますが、複数のAWSアカウントを扱っていると切り替えが面倒でした。)
機能
lazy-awslogs は、より少ないコマンド入力でログを取得するための2つの機能があります。
Bash Completion
LogGroup や LogStream を一括取得し、ローカルにキャッシュして Bash Completion でインクリメンタルな入力補完ができます。現在は bash と fish shell に対応しています。
Configuration
AWSアカウントごとのデフォルト設定をConfigurationに保存し、使いたい設定を切り替えることができます。イメージとしては rbenv like な感じです。
苦労したこと
Bash Completion
lazy-awslogs は、Cobra という CLIツールを作るためのフレームワークライブラリを用いています。Cobra には Bash Completion をサポートする 機能があり 、これを使えば自分でシェルを書くことなく Bash Completion を実現できるのかと思ったのですが、簡単にはできませんでした。これは kubectl で Bash Completion をサポートするために入れられたコミットで、これを使うには lazy-awslogs にも kubectl と同様の対応が必要ということが分かりました。結局この機能は使わずに、シェルを自分で書くことにしました。
OSSの名前を決めること
lazy-awslogs を公開するまでの製作期間は3週間くらいで、その間は BitBucket でタスク管理していたのですが、どのタスクよりもこれが一番時間がかかりましたw 名前の条件として 1. Amazon CloudWatch Logs に関するツールであること、2. 他のOSSと重複しないこと、3. type しやすいこと、の3つ設定しましたが、1と2が厳しすぎました。最終的に awslogs への Respect を込めて lazy-awslogs という名前にしました。
名前が長くて type しにくいので、コマンド名は違うものにしようとしたのですが、どうすればうまく Build できるのか分からずで、これは今後の課題です。
Goを学んでみて
道標
Goを学ぶための情報はたくさんあるので困ることはありませんでした。中でも活用したのが以下の2つです。
1つめはリンク集で入門者の道標になります。2つめはGoのチュートリアルで、ブラウザ上でコードを実行しながら文法を学ぶことができます。基本的な文法がわかったところで、あとはライブラリのリファレンスやブログエントリーなどを参照しました。
感想
Goは機能や文法が少ないため、学習コストはとても低いと感じました。また、静的型付けでありながら型推論もできるので記述量は多くなく、コーディングルールが決まっており golint(CodeFormatter) がとてもよくできているので、効率よく開発できるのが好感でした。
もやもやとしては、オブジェクト指向言語の感覚で書こうとすると、継承やジェネリクスがないのでコードをどうやって抽象化して書けばよいのか分からず、未だに迷っています。
謝辞
Bash-Complitionなど色々なアイディアを提供してくれ、実装もかなり手伝ってくれた同僚の yamaya さんに感謝します。
今後
lazy-awslogs は、ようやく公開できる最低限のレベルに達した段階で、実用にはまだ早いです。まだ実装したい機能や改善したいコードなどたくさんありますので、OSSとしてフィードバックを受けつつ細く長く続けていきたいと思います。Contributeも大歓迎ですので、興味があればぜひご参加ください。